package com.example.kotlindemo.funparams

import java.lang.IllegalArgumentException

/**
 *  函数简化
 *      1. 使用 = 连接返回值
 */
class Rectangle {

    // 1. 有返回值 ，一行代码
    fun area(width: Int, height: Int): Int {
        return width * height
    }

    //只有一行代码的函数，可以直接用 = 连接，｛｝和return都没有了
    fun area2(width: Int, height: Int): Int = width * height

    //Kt有【类型推断】的特性，返回类型还可以隐藏掉（一般还是写出来，增加可读性）
    fun area3(width: Int, height: Int) = width * height

//2. 没有返回值，可以理解为返回值是  Unit

    fun sayHi(name: String) {
        println("Hi$name")
    }

    fun sayHello(name: String) = println("Hello$name")


//3. 默认参数
    //如果不传入名字，那么默认调用的 “我能”
    fun sayICan(word: String = "我能") = println("小龙$word")


//4.命名参数
    //显示的指定了参数age的名称，这就是【命名参数】
    fun sayHi(name: String = "默认小龙", age: Int) = println("$name 年龄 $age")


//5.本地函数（嵌套函数）
//    fun login(user: String, password: String, illegalStr: String) {
//        // 验证 user 是否为空
//        if (user.isEmpty()) {
//            throw IllegalArgumentException(illegalStr)
//        }
//        // 验证 password 是否为空
//        if (password.isEmpty()) {
//            throw IllegalArgumentException(illegalStr)
//        }
//    }
    //检查参数这个部分有些冗余，但是又不想将这段逻辑作为一个函数对外暴露
    //这时候，就可以使用嵌套函数，在 login 函数内部声明一个函数
    fun login(user: String,password: String,illegalStr: String){

        //将共同验证逻辑放进了嵌套函数中，并且 login() 函数之外的其它地方
        // 无法访问这个嵌套函数，嵌套函数可以访问外面的参数
        fun validate(value:String){
            if (value.isEmpty()) {
                throw IllegalArgumentException(illegalStr)
            }
        }

        validate(user)
        validate(password)
    }





















}